Финальный проект спринта: модуль фитнес-трекера
Задача итогового проекта этого спринта — создать программный модуль для фитнес-трекера, используя парадигму ООП. Этот модуль должен рассчитывать и отображать результаты тренировки.
Задание
Разработайте программный модуль фитнес-трекера, который обрабатывает данные для трёх видов тренировок: бега, спортивной ходьбы и плавания.
Этот модуль должен выполнять следующие функции:
- принимать от блока датчиков информацию о прошедшей тренировке,
- определять вид тренировки,
- рассчитывать результаты тренировки,
- выводить информационное сообщение о результатах тренировки.
Информационное сообщение должно включать такие данные:
- тип тренировки (бег, ходьба или плавание);
- длительность тренировки;
- дистанция, которую преодолел пользователь, в километрах;
- среднюю скорость на дистанции, в км/ч;
- расход энергии, в килокалориях.
❗ В ТЗ указаны формулы, которые нужно использовать для расчёта результатов тренировок. Хороший разработчик чётко следует всем требованиям ТЗ. Не меняйте формулы, используйте их в точно таком же виде, как они указаны в задании.
Вам не придётся писать программу с нуля. В репозитории с вашим домашним заданием есть файл homework.py. В нём уже описаны некоторые функции и оформлен эскиз будущей программы. Работайте в этом файле и используйте то, что у вас есть, по максимуму.
Структура программы
Базовый класс Training
В классах, описывающих любой из видов тренировки, применяются одни и те же свойства и методы. Чтобы избежать дублирования кода, необходимо создать базовый класс
Training. Он должен содержать все основные свойства и методы для тренировок. Каждый класс, описывающий определённый вид тренировки, будет дополнять и расширять базовый класс.Методы базового класса
Метод
get_distance() возвращает дистанцию (в километрах), которую преодолел пользователь за время тренировки.Формула расчёта:
PYTHON
action * LEN_STEP / M_IN_KM action, типint— количество совершённых действий (число шагов при ходьбе и беге либо гребков — при плавании).LEN_STEP— расстояние, которое спортсмен преодолевает за один шаг или гребок. Один шаг — это0.65метра, один гребок при плавании —1.38метра.M_IN_KM— константа для перевода значений из метров в километры. Её значение —1000.
Метод
get_mean_speed() возвращает значение средней скорости движения во время тренировки.Формула расчёта:
PYTHON
преодолённая_дистанция_за_тренировку / время_тренировки Метод
get_spent_calories() возвращает количество килокалорий, израсходованных за время тренировки.Логика подсчёта калорий для каждого вида тренировки будет своя, поэтому в базовом классе не нужно описывать поведение метода, в его теле останется ключевое слово
pass.Метод
show_training_info() возвращает объект класса сообщения.class InfoMessage
Это самостоятельный класс для создания объектов сообщений. У этого класса должен быть метод для вывода сообщений на экран.
Объекты этого класса создаются вызовом метода
show_training_info() для классов тренировок.Свойства класса
InfoMessage:training_type— имя класса тренировки;duration— длительность тренировки в часах;distance— дистанция в километрах, которую преодолел пользователь за время тренировки;speed— средняя скорость, с которой двигался пользователь;calories— количество килокалорий, которое израсходовал пользователь за время тренировки.
У класса
InfoMessage должен быть метод get_message(), который возвращает строку сообщения:PYTHON
Тип тренировки: {training_type}; Длительность: {duration} ч.; Дистанция: {distance} км; Ср. скорость: {speed} км/ч; Потрачено ккал: {calories}. ❗ Числовые значения при выводе должны быть отформатированы до тысячных долей (до третьего знака после запятой).
Дочерние классы
Каждый вид спортивной активности в модуле должен быть описан соответствующим классом:
- Бег →
class Running; - Спортивная ходьба →
class SportsWalking; - Плавание →
class Swimming.
Конструктор каждого из классов должен получать информацию с датчиков:
action, типint— количество совершённых действий (число шагов при ходьбе и беге либо гребков — при плавании);duration, типfloat— длительность тренировки;weight, типfloat— вес спортсмена.
Чтобы определить дистанцию, которую преодолел спортсмен, нужно число шагов или гребков, переданное в
action, перевести в километры. Для расчёта нужно добавить атрибуты класса:
LEN_STEP— расстояние, которое спортсмен преодолевает за один шаг или гребок. Один шаг — это0.65метра, один гребок при плавании —1.38метра.M_IN_KM— константа для перевода значений из метров в километры. Её значение —1000.
Методы классов, которые отвечают за обработку данных:
- расчёт дистанции, которую пользователь преодолел за тренировку:
get_distance(); - расчёт средней скорости движения во время тренировки:
get_mean_speed(); - расчёт количества калорий, израсходованных за тренировку:
get_spent_calories(); - создание объекта сообщения о результатах тренировки:
show_training_info().
Особенности реализации классов-наследников
class Running
Все свойства и методы этого класса без изменений наследуются от базового класса. Исключение составляет только метод расчёта калорий, его нужно переопределить.
Расход калорий для бега рассчитывается по такой формуле:
PYTHON
(18 * средняя_скорость + 1.79) * вес_спортсмена / M_IN_KM * время_тренировки_в_минутах Важно вынести все неименованные значения в константы на уровне класса. Код станет понятнее для разработчиков, которые будут его читать.
Имена констант должны отражать их смысл, для данной формулы имена переменных могут быть такими:
PYTHON
CALORIES_MEAN_SPEED_MULTIPLIER = 18
CALORIES_MEAN_SPEED_SHIFT = 1.79 Тогда формулу для подсчёта калорий можно записать так:
PYTHON
((CALORIES_MEAN_SPEED_MULTIPLIER * средняя_скорость + CALORIES_MEAN_SPEED_SHIFT)
* вес_спортсмена / M_IN_KM * время тренировки_в_минутах) class SportsWalking
Конструктор этого класса принимает дополнительный параметр
height — рост спортсмена.Расчёт калорий для этого класса должен проводиться по такой формуле:
PYTHON
((0.035 * вес + (средняя_скорость_в_метрах_в_секунду**2 / рост_в_метрах)
* 0.029 * вес) * время_тренировки_в_минутах) Числовым коэффициентам тоже нужны имена, не забывайте про это. Но это не касается, например, значения степени.
class Swimming
Конструктор класса
Swimming, кроме свойств базового класса, принимает ещё два параметра:length_pool— длина бассейна в метрах;count_pool— сколько раз пользователь переплыл бассейн.
В классе
Swimming нужно переопределить не только метод расчёта калорий get_spent_calories(), но и метод get_mean_speed(), который рассчитывает среднюю скорость.Формула расчёта средней скорости при плавании:
PYTHON
длина_бассейна * count_pool / M_IN_KM / время_тренировки Формула для расчёта израсходованных калорий:
PYTHON
(средняя_скорость + 1.1) * 2 * вес * время_тренировки Есть и ещё один параметр, который надо переопределить, ведь расстояние, преодолеваемое за один гребок, отличается от длины шага. Значит, необходимо переопределить атрибут
LEN_STEP базового класса.Имитация получения данных от блока датчиков фитнес-трекера
Прежде чем отдавать модуль в релиз, его работоспособность нужно проверить на реальном фитнес-трекере. Но у разработчиков не всегда есть такая возможность, поэтому можно имитировать работу датчиков и передать в программу заранее подготовленные тестовые данные.
В исходном коде эти данные уже подготовлены:
PYTHON
if __name__ == '__main__':
packages = [
('SWM', [720, 1, 80, 25, 40]),
('RUN', [15000, 1, 75]),
('WLK', [9000, 1, 75, 180]),
]
for workout_type, data in packages:
training = read_package(workout_type, data)
main(training) Данные для тестов
Блок датчиков фитнес-трекера передаёт пакеты данных в виде кортежа, первый элемент которого — кодовое обозначение прошедшей тренировки, второй — список показателей, полученных от датчиков устройства. Для проверки были смоделированы пакеты для каждого вида тренировки и добавлены в список
packages:PYTHON
packages = [
('SWM', [720, 1, 80, 25, 40]),
('RUN', [15000, 1, 75]),
('WLK', [9000, 1, 75, 180]),
] Последовательность данных в принимаемых пакетах:
Плавание
- Код тренировки:
'SWM'. - Элементы списка: количество гребков, время в часах, вес пользователя, длина бассейна, сколько раз пользователь переплыл бассейн.
Бег
- Код тренировки:
'RUN'. - Элементы списка: количество шагов, время тренировки в часах, вес пользователя.
Спортивная ходьба
- Код тренировки:
'WLK'. - Элементы списка: количество шагов, время тренировки в часах, вес пользователя, рост пользователя.
Программа должна перебирать в цикле список пакетов, распаковывает каждый кортеж и передаёт данные в функцию
read_package().Функция чтения принятых пакетов read_package()
Функция
read_package() должна определить тип тренировки и создать объект соответствующего класса, передав ему на вход параметры, полученные во втором аргументе. Этот объект функция должна вернуть.Функция
read_package() должна принимать на вход код тренировки и список её параметров.PYTHON
read_package(workout_type, data) В теле функции (или рядом с ней) должен быть словарь, в котором сопоставляются коды тренировок и классы, какие нужно вызвать для каждого типа тренировки.
Функция main()
Функция
main() должна принимать на вход экземпляр класса Training.- При выполнении функции
main()для этого экземпляра должен быть вызван методshow_training_info(); результатом выполнения метода должен быть объект классаInfoMessage, его нужно сохранить в переменнуюinfo. - Для объекта
InfoMessage, сохранённого в переменнойinfo, должен быть вызван метод, который вернёт строку сообщения с данными о тренировке; эту строку нужно передать в функциюprint().
Задача описана, можно приступать к её выполнению. Удачи!